home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / SMISC.C < prev    next >
C/C++ Source or Header  |  1989-08-18  |  5KB  |  252 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "proc.h"
  7. #include "remote.h"
  8. #include "smtp.h"
  9. #include "tcp.h"
  10. #include "pc.h"
  11.  
  12. extern FILE *Logfp;
  13. extern int errno;
  14.  
  15. char *Rempass;    /* Remote access password */
  16.  
  17. static int chkrpass __ARGS((struct mbuf *bp));
  18. static void discserv __ARGS((int s,void *unused,void *p));
  19. static void echoserv __ARGS((int s,void *unused,void *p));
  20.  
  21. static int Rem = -1;
  22. static int Sdisc = -1;
  23. static int Secho = -1;
  24.  
  25. /* Start up TCP discard server */
  26. int
  27. dis1(argc,argv,p)
  28. int argc;
  29. char *argv[];
  30. void *p;
  31. {
  32.     struct sockaddr_in lsocket;
  33.     int s;
  34.  
  35.     if(Sdisc != -1){
  36.         freeargs(argc,argv);
  37.         return 0;
  38.     }
  39.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  40.     chname(Curproc,"Discard listener");
  41.  
  42.     lsocket.sin_family = AF_INET;
  43.     lsocket.sin_addr.s_addr = Ip_addr;
  44.     if(argc < 2)
  45.         lsocket.sin_port = IPPORT_DISCARD;
  46.     else
  47.         lsocket.sin_port = atoi(argv[1]);
  48.     freeargs(argc,argv);
  49.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  50.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  51.     listen(Sdisc,1);
  52.     for(;;){
  53.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  54.             break;    /* Service is shutting down */
  55.  
  56.         /* Spawn a server */
  57.         newproc("Discard server",576,discserv,s,NULL,NULL);
  58.     }
  59.     return 0;
  60. }
  61. static void
  62. discserv(s,unused,p)
  63. int s;
  64. void *unused;
  65. void *p;
  66. {
  67.     struct mbuf *bp;
  68.  
  69.     sockowner(s,Curproc);
  70.     log(s,"open discard");
  71.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  72.         free_p(bp);
  73.     log(s,"close discard");
  74.     close_s(s);
  75. }
  76. /* Stop discard server */
  77. int
  78. dis0(argc,argv,p)
  79. int argc;
  80. char *argv[];
  81. void *p;
  82. {
  83.     close_s(Sdisc);
  84.     Sdisc = -1;
  85.     return 0;
  86. }
  87. /* Start up TCP echo server */
  88. int
  89. echo1(argc,argv,p)
  90. int argc;
  91. char *argv[];
  92. void *p;
  93. {
  94.     struct sockaddr_in lsocket;
  95.     int s;
  96.  
  97.     if(Secho != -1){
  98.         freeargs(argc,argv);
  99.         return 0;
  100.     }
  101.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  102.     chname(Curproc,"Echo listener");
  103.  
  104.     lsocket.sin_family = AF_INET;
  105.     lsocket.sin_addr.s_addr = Ip_addr;
  106.     if(argc < 2)
  107.         lsocket.sin_port = IPPORT_ECHO;
  108.     else
  109.         lsocket.sin_port = atoi(argv[1]);
  110.     freeargs(argc,argv);
  111.     Secho = socket(AF_INET,SOCK_STREAM,0);
  112.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  113.     listen(Secho,1);
  114.     for(;;){
  115.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  116.             break;    /* Service is shutting down */
  117.  
  118.         /* Spawn a server */
  119.         newproc("Echo server",2048,echoserv,s,NULL,NULL);
  120.     }
  121.     return 0;
  122. }
  123. static void
  124. echoserv(s,unused,p)
  125. int s;
  126. void *unused;
  127. void *p;
  128. {
  129.     struct mbuf *bp;
  130.  
  131.     sockowner(s,Curproc);
  132.     log(s,"open echo");
  133.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  134.         send_mbuf(s,bp,0,NULLCHAR,0);
  135.  
  136.     log(s,"close echo");
  137.     close_s(s);
  138. }
  139. /* stop echo server */
  140. int
  141. echo0(argc,argv,p)
  142. int argc;
  143. char *argv[];
  144. void *p;
  145. {
  146.     close_s(Secho);
  147.     Secho = -1;
  148.     return 0;
  149. }
  150. /* Start remote exit/reboot server */
  151. int
  152. rem1(argc,argv,p)
  153. int argc;
  154. char *argv[];
  155. void *p;
  156. {
  157.     struct sockaddr_in lsocket,fsock;
  158.     int i;
  159.     char command;
  160.     struct mbuf *bp;
  161.     int32 addr;
  162.  
  163.     if(Rem != -1){
  164.         freeargs(argc,argv);
  165.         return 0;
  166.     }
  167.     psignal(Curproc,0);
  168.     chname(Curproc,"Remote listener");
  169.     lsocket.sin_family = AF_INET;
  170.     lsocket.sin_addr.s_addr = Ip_addr;
  171.     if(argc < 2)
  172.         lsocket.sin_port = IPPORT_REMOTE;
  173.     else
  174.         lsocket.sin_port = atoi(argv[1]);
  175.     
  176.     freeargs(argc,argv);
  177.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  178.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  179.     for(;;){
  180.         i = sizeof(fsock);
  181.         if(recv_mbuf(Rem,&bp,0,0,(char *)&fsock,&i) == -1)
  182.             break;
  183.         command = pullchar(&bp);
  184.  
  185.         switch(uchar(command)){
  186. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  187.         case SYS_RESET:
  188.             i = chkrpass(bp);
  189.             log(Rem,"%s - Remote reset %s",
  190.              psocket((struct sockaddr *)&fsock),
  191.              i == 0 ? "PASSWORD FAIL" : "" );
  192.             if(i != 0){
  193.                 iostop();
  194.                 sysreset();    /* No return */
  195.             }
  196.             break;
  197. #endif
  198.         case SYS_EXIT:
  199.             i = chkrpass(bp);
  200.             log(Rem,"%s - Remote exit %s",
  201.              psocket((struct sockaddr *)&fsock),
  202.              i == 0 ? "PASSWORD FAIL" : "" );
  203.             if(i != 0){
  204.                 iostop();
  205.                 exit(0);
  206.             }
  207.             break;
  208.         case KICK_ME:
  209.             if(len_mbuf(bp) >= sizeof(int32))
  210.                 addr = pull32(&bp);
  211.             else
  212.                 addr = fsock.sin_addr.s_addr;
  213.             kick(addr);
  214.             smtptick((void *)addr);
  215.             break;
  216.         }
  217.         free_p(bp);
  218.     }
  219.     close_s(Rem);
  220.     Rem = -1;
  221.     return 0;
  222. }
  223. /* Check remote password */
  224. static int
  225. chkrpass(bp)
  226. struct mbuf *bp;
  227. {
  228.     char *lbuf;
  229.     int16 len;
  230.     int rval = 0;
  231.  
  232.     len = len_mbuf(bp);
  233.     if(strlen(Rempass) != len)
  234.         return rval;
  235.     lbuf = malloc(len);
  236.     pullup(&bp,lbuf,len);
  237.     if(strncmp(Rempass,lbuf,len) == 0)
  238.         rval = 1;
  239.     free(lbuf);
  240.     return rval;
  241. }
  242. int
  243. rem0(argc,argv,p)
  244. int argc;
  245. char *argv[];
  246. void *p;
  247. {
  248.     close_s(Rem);
  249.     return 0;
  250. }
  251.  
  252.